#ifndef __ETHERNET_H
#define __ETHERNET_H

/*
	Формат пакета протокола LINK
	Длина| Код команды | Данные |
	2 б		1 б				N б
*/

//Номера байтов внутри пакета LINK
#define LINK_LENGTH 			0  	//длина 
#define LINK_TYPE					2	//код команды
#define LINK_DATA					3	//данные

#define LINK_HEADER_SIZE	3	//размер заголовка пакета ConfiBoot


//Коды команд протокола LINK
#define CMD_GET_INFO								0x01
#define CMD_WRITE_FILE_BLOCK  			0x02
#define CMD_WRITE_FILE_INFO					0x03
#define CMD_JUMP_TO_APPLICATION  		0x04
#define CMD_JUMP_TO_BOOTLOADER  		0x05

#define ANS_INFO										0x81


#define ANS_OK											0x80
#define ANS_ERROR										0xFF


/*
	Коды ошибок
*/
#define ERROR_LENGTH_FIELD 					0x51
#define ERROR_NOT_SUPPORTED					0x52
#define ERROR_PARAMETER							0x53
#define ERROR_FILE_SIZE							0x54
#define ERROR_BLOCK_NUMBER					0x55


#define FILE_BLOCK_SIZE							1024
#define MAX_FILE_SIZE								416*1024 



typedef struct
{
	U8 ip[4];
	U8 gateway[4];
	U8 netmask[4];
}NetParamsT;

/*
	Глобальные переменные
*/
extern NetParamsT *netParams;

/*
	Прототипы функций
*/
void ethernet_init(void);
void sockets_init(void);
void tcpip_prc(void);
U16 tcpServer_callback (U8 soc, U8 event, U8 *ptr, U16 par);
void ethernet_parse_packet(U8 * packet, U16 length, U8 socket);
U8 tcp_send_data(U8 * data, U16 size, U8 sock);
void link_send_packet(U8 type, U8 * data, U16 data_length,U8 sock);
void ans_ok(U8 type,U8 sock);
void ans_error(U8 type, U8 error,U8 sock);

void cmd_write_file_block(U8 * packet, U16 length, U8 socket);
void cmd_write_file_info(U8 * packet, U16 length, U8 socket);
void cmd_jumpto_application(U8 * packet, U16 length, U8 socket);
void cmd_get_info(U8 * packet, U16 length, U8 socket);
U16 udpServer_callback (U8 socket, U8 *remip, U16 port, U8 *buf, U16 len);
U8 udp_send_data(U8 * data, U16 size, U8 sock);
#endif
